package com.qingxin.sys.utils;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import com.swetake.util.Qrcode;

/**
 * 生成二维码
 * @author Administrator
 *
 */
public class QRCoder {

	
	/** 纠错级别：低(~7%) */
	public static final char ERROR_CORRECT_L = 'L';
	/** 纠错级别：中(~15%) */
	public static final char ERROR_CORRECT_M = 'M';
	/** 纠错级别：高(~25%) */
	public static final char ERROR_CORRECT_Q = 'Q';
	/** 纠错级别：最高(~30%) */
	public static final char ERROR_CORRECT_H = 'H';
	
	
	
	/**
	 * 生成QrCode二维码图片，白底黑图
	 * 
	 * @param text 图片内容
	 * @param width 图片宽度
	 * @param height 图片高度
	 * @param margin 图片边缘大小
	 * @param errorCorrect 纠错级别：LMQH
	 * @return
	 * @throws Exception
	 */
	public static BufferedImage encode(String text, int width, int height, int margin, char errorCorrect) throws Exception {
		return encode(text, "GBK", width, height, margin, errorCorrect, Color.black, Color.white);
	}
	
	
	/**
	 * 生成QrCode二维码图片
	 * 
	 * @param text 图片内容
	 * @param width 图片宽度
	 * @param height 图片高度
	 * @param margin 图片边缘大小
	 * @param errorCorrect 纠错级别：LMQH
	 * @param fgcolor 前景色
	 * @param bgcolor 背景色
	 * @return
	 * @throws Exception
	 */
	public static BufferedImage encode(String text, int width, int height, int margin, char errorCorrect, Color fgcolor, Color bgcolor) throws Exception {
		return encode(text, "UTF-8", width, height, margin, errorCorrect, fgcolor, bgcolor);
	}
	
	
	/**
	 * 生成QrCode二维码图片，白底黑图
	 * 
	 * @param text 图片内容
	 * @param charset 内容编码字符集，默认GBK
	 * @param width 图片宽度
	 * @param height 图片高度
	 * @param margin 图片边缘大小
	 * @param errorCorrect 纠错级别：LMQH
	 * @return
	 * @throws Exception
	 */
	public static BufferedImage encode(String text, String charset, int width, int height, int margin, char errorCorrect) throws Exception {
		return encode(text, charset, width, height, margin, errorCorrect, Color.black, Color.white);
	}
	
	
	/**
	 * 生成QrCode二维码图片
	 * 
	 * @param text 图片内容
	 * @param charset 内容编码字符集，默认GBK
	 * @param width 图片宽度
	 * @param height 图片高度
	 * @param margin 图片边缘大小
	 * @param errorCorrect 纠错级别：LMQH
	 * @param fgcolor 前景色
	 * @param bgcolor 背景色
	 * @return
	 * @throws Exception
	 */
	public static BufferedImage encode(String text, String charset, int width, int height, int margin, char errorCorrect, Color fgcolor, Color bgcolor) throws Exception {
		Qrcode coder = new Qrcode();
		coder.setQrcodeErrorCorrect(errorCorrect);
		coder.setQrcodeEncodeMode('B');
		coder.setQrcodeVersion(0);
		
		if(charset==null){
			charset = "GBK";
		}
		
		byte[] bytes = text.getBytes(charset);
		boolean[][] data = coder.calQrcode(bytes);
		final int dLen = data.length;
		
		int blockSize = (width - margin*2)/dLen;
		int offset = (width - blockSize * dLen) / 2;
		
		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		Graphics2D g2d = image.createGraphics();
		
		g2d.setColor(bgcolor);
		g2d.fillRect(0, 0, width, height);
		
		g2d.setColor(fgcolor);
		
		for(int i = 0; i < dLen; i++) {
			for(int j = 0; j < dLen; j++) {
				if(data[j][i]){
					g2d.fillRect(j * blockSize + offset, i * blockSize + offset, blockSize, blockSize);
				}
			}
		}
		
		g2d.dispose();
		image.flush();
		
		return image;
	}
	
}
